# 在创建对象时给每个对象直接赋值属性的初始值

# __init__()
# 构造方法，在使用类创建实例时自动调用
class Person(object):
    # 定义类属性
    # 后期除非定义单例类，否则基本不用写
    @classmethod
    def __new__(cls, *args, **kwargs):
        print("------------------1")
        # 调用父类中的__new__方法开辟内存空间
        return super(Person, cls).__new__(cls)

    # 构造函数
    def __init__(self, name, age, height, weight):
        # 对象属性，对象方法只能对象调用
        print("-----------------2")
        self.name = name
        self.age = age
        self.height = height
        self.weight = weight
    def say(self):
        # 对象方法中可以调用对象属性
        return "my name is %s,I am %d years old"%(self.name, self.age)


# 创建对象时给每个对象的属性赋值
per1 = Person("lifeibiao", 10, 20, 60)
per2 = Person("lifei", 20, 40, 120)
print(per1.name)
print(per2.name)

# print(Person.name)类中没有name属性，且类名无法调用对象属性

print(per1.say())
print(per2.say())

# 延伸
# __new__()方法：是一个类方法，返回一个对象的实例，在使用类实例化对象时自动调用，
# 目的是在堆区开辟一片内存空间，会在__init__之前调用
# 使用：创建单例类